package com.qiange.stumanager.controller;

import com.qiange.stumanager.dao.IDao;
import com.qiange.stumanager.dao.impl.StudentDaoImpl;
import com.qiange.stumanager.domain.Student;
import com.qiange.stumanager.service.IService;
import com.qiange.stumanager.service.impl.StudentServiceImpl;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Scanner;

/**
 * @author linchaoran
 */
public class StudentController {
    IService service = new StudentServiceImpl();
    Scanner sc = new Scanner(System.in);

    /**
     * 学生信息管理系统菜单搭建
     */
    public void start() {
        service.iputStream();
        boolean flag = true;
        while (flag) {
            System.out.println("欢迎访问学生管理系统");
            System.out.println("1. 添加");
            System.out.println("2. 查看");
            System.out.println("3. 删除");
            System.out.println("4. 修改");
            System.out.println("5. 退出");

            System.out.println("请输入您的选择");
            String choice = sc.next();

            switch (choice) {
                case "1":
                    add();
                    break;
                case "2":
                    findAll();
                    break;
                case "3":
                    remove();
                    break;
                case "4":
                    set();
                    break;
                case "5":
                    System.out.println("感谢使用");
                    flag = false;
                    break;
                default:
                    System.out.println("您的输入有误");
                    break;
            }
        }

    }

    /**
     * 判断输入的学号sid是否存在
     *
     * @return 学号
     */
    private String getId() {
        String sid;
        int index;
        while (true) {
            System.out.println("请输入学号");
            sid = sc.next();
            index = getIndexByid(sid);
            //返回下标为-1，说明该学号不存在
            if (index == -1) {
                System.out.println("您输入的学号不存在，请重新输入");
            } else {
                break;
            }
        }
        return sid;
    }

    /**
     * 修改功能
     */
    private void set() {
        //判断学号是否存在
        String sid = getId();
        //用符合要求的学号寻找下标
        int index = getIndexByid(sid);
        //获取学生新值对象
        Student student = getStudent(sid);
        //调用修改方法对旧信息根据下标进行覆盖
        boolean set = service.set(index, student);
        if (set) {
            System.out.println("修改成功");
        } else {
            System.out.println("修改失败");
        }
    }

    /**
     * 获取学生对象
     *
     * @param sid 学号
     * @return 学生对象
     */
    private Student getStudent(String sid) {
        System.out.println("请输入姓名");
        String name = sc.next();
        String birthday = null;
        int age;
        while (true) {
            try {
                System.out.println("请输入生日,格式为yyyy-MM-dd");
                birthday = sc.next();
                //规定生日的输入格式
                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
                //判断输入的格式是否正确
                LocalDate parse = LocalDate.parse(birthday, dtf);
                //获取当前时间
                LocalDate now = LocalDate.now();
                //利用当前时间的年份减去输入生日的年份来获取年龄
                age = now.getYear() - parse.getYear();
                break;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return new Student(sid, name, age, birthday);
    }

    /**
     * 删除功能
     */
    private void remove() {
        //判断学号是否存在
        String sid = getId();
        //利用符合要求的学号获取下标
        int index = getIndexByid(sid);
        //对该下标的元素进行删除
        boolean remove = service.remove(index);
        if (remove) {
            System.out.println("删除成功");
        } else {
            System.out.println("删除失败");
        }
    }

    /**
     * 查找学生
     */
    private void findAll() {
        ArrayList<Student> list = service.findAll();
        //判断集合是否为空
        if (list.size() == 0) {
            System.out.println("暂无数据，请添加后重试");
            return;
        }
        //打印集合里全部的学生对象
        for (Student student : list) {
            System.out.println(student);
        }
    }

    /**
     * 添加功能
     */
    private void add() {
        String sid;
        //判断输入的学号是否在集合中已存在
        while (true) {
            System.out.println("请输入学号");
            sid = sc.next();
            int index = getIndexByid(sid);
            //返回下标不为-1，说明该学号已存在
            if (index != -1) {
                System.out.println("您输入的学号已存在，请重新输入");
            } else {
                break;
            }
        }
        //获取学生对象
        Student stu = getStudent(sid);
        //调用添加方法
        boolean add = service.add(stu);
        if (add) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }
    }

    /**
     * 获取下标
     *
     * @param sid 学号
     * @return 下标
     */
    private int getIndexByid(String sid) {
        //获取集合
        ArrayList<Student> list = service.findAll();
        for (int i = 0; i < list.size(); i++) {
            Student stu = list.get(i);
            //判断输入的学号是否在集合中已存在
            if (sid.equals(stu.getSid())) {
                //已存在返回下标
                return i;
            }
        }
        //不存在返回-1
        return -1;
    }
}
